package com.fasteat.mall.service.impl;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.fasteat.common.entity.GlobalException;
import com.fasteat.common.entity.Result;
import com.fasteat.mall.config.AlipayConfig;
import com.fasteat.mall.entity.Orderform;
import com.fasteat.mall.entity.dto.PayDto;
import com.fasteat.mall.service.OrderformService;
import com.fasteat.mall.service.PaymentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * @author 白sa能
 * @className
 * @date Created in 4:54 PM 2/10/21
 * @package com.fasteat.mall.service.impl
 * @Description
 */
@Service
public class PaymentServiceImpl implements PaymentService {

    @Autowired
    private OrderformService orderformService;


    /**
     * 支付宝方法
     * 传入订单金额和订单号
     *
     * @param payDto
     * @return
     */
    @Override
    public String order(PayDto payDto) {
        /*自己写的 查询订单状态*/
        Orderform orderform = orderformService.getById(payDto.getOrderForm());
        if(orderform.getOrderStatus().equals(2)
                || orderform.getOrderStatus().equals(3)
                || orderform.getOrderStatus().equals(4)
                || orderform.equals(null)) {
            throw new GlobalException(Result.error("该订单号不合法(订单不存在、已支付、已发货、已送达等等原因)"));
        }
        //支付宝网关
        String url = AlipayConfig.URL;
        //商户的APPID
        String appid = AlipayConfig.APPID;
        //商户的私钥
        String appPrivateKey = AlipayConfig.APP_PRIVATE_KEY;
        //参数返回格式
        String format = AlipayConfig.FORMAT;
        //字符编码
        String charset = AlipayConfig.CHARSET;
        //支付宝公钥
        String alipayPublicKey = AlipayConfig.ALIPAY_PUBLIC_KEY;
        //商户生成签名的算法
        String signtype = AlipayConfig.SIGNTYPE;

        //实例化客户端
        AlipayClient alipayClient = new DefaultAlipayClient(url, appid, appPrivateKey, format, charset, alipayPublicKey, signtype);

        //SDK已经封装掉了公共参数，这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        //商品标题
        model.setSubject("ssss");
        //商家订单的唯一编号
        model.setOutTradeNo(payDto.getOrderForm());
        //超时关闭该订单时间
        model.setTimeoutExpress("30m");
        //订单总金额
        model.setTotalAmount(payDto.getPricePaid());
        //销售产品码，商家和支付宝签约的产品码，为固定值QUICK_MSECURITY_PAY
        model.setProductCode("QUICK_MSECURITY_PAY");

        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称：alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        request.setBizModel(model);
        //异步回调地址（后台）
        request.setNotifyUrl(AlipayConfig.notify_url);
        //同步回调地址（APP）同上
        //request.setReturnUrl(AlipayConfig.return_url);

        String orderString = "";
        try {
            //这里和普通的接口调用不同，使用的是sdkExecute
            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
            //orderString 可以直接给客户端请求，无需再做处理。
            orderString = response.getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
            throw new GlobalException(Result.error("与支付宝交互出错，未能生成订单，请检查代码！"));
        }
        return orderString;
    }

    /**
     * 支付宝异步请求逻辑处理
     *
     * @param
     * @return
     * @throws AlipayApiException
     */
    @Override
    public boolean aliNotify(Map<String, String> conversionParams) {
        //签名验证(对支付宝返回的数据验证，确定是支付宝返回的)
        boolean signVerified = false;
        try {
            //调用SDK验证签名
            String alipayPublicKey = AlipayConfig.ALIPAY_PUBLIC_KEY;
            String charset = AlipayConfig.CHARSET;
            String signType = AlipayConfig.SIGNTYPE;

            signVerified = AlipaySignature.rsaCheckV1(conversionParams, alipayPublicKey, charset, signType);
            //对验签进行处理.
            if (signVerified) {
                // 按照支付结果异步通知中的描述，对支付结果中的业务内容进行1\2\3\4二次校验，校验成功后在response中返回success，校验失败返回failure 支付宝官方建议校验的值（out_trade_no、total_amount、sellerId、app_id）
                //支付宝回调后验证的参数..测试的话可以注释掉
//                this.check(conversionParams);

                //验签通过 获取交易状态
                String tradeStatus = conversionParams.get("trade_status");

                /*开始自己写，出错点可能较多，从此处开始debug*/
                //交易成功 获取商户订单号
                String orderFormId = conversionParams.get("out_trade_no");
                Orderform orderform = orderformService.getById(orderFormId);
                /*自己写结束*/

                //只处理支付成功的订单: 修改交易表状态,支付成功
                //只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时，支付宝才会认定为买家付款成功。
                if (tradeStatus.equals("TRADE_SUCCESS") || tradeStatus.equals("TRADE_FINISHED")) {
                    //TODO 获取支付宝通知完成订单后续业务
                    /**修改订单信息*/
                    //修改为已支付
                    orderform.setOrderStatus(2);
                    //这里就主要是做你们自己的业务需求了,修改一些表什么的..
                } else {
                    //修改为未支付
                    orderform.setOrderStatus(1);
                }
                orderform.setId(orderFormId);
                orderformService.updateById(orderform);
                return true;
            } else {
                return false;
            }
        } catch(
            AlipayApiException e) {
            e.printStackTrace();
        }
        return false;
    }
}
